export const getInputs = () => [[[2, 1, 3, 4, 5, 2]], [[2, 3, 5, 1, 3, 2]]];

/**
 * **[6351. 标记所有元素后数组的分数](https://leetcode.cn/contest/biweekly-contest-100/problems/find-score-of-an-array-after-marking-all-elements/)**
 *
 * 给你一个数组 `nums` ，它包含若干正整数。
 *
 * 一开始分数 `score = 0` ，请你按照下面算法求出最后分数：
 *
 * - 从数组中选择最小且没有被标记的整数。如果有相等元素，选择下标最小的一个。
 * - 将选中的整数加到 `score` 中。
 * - 标记 **被选中元素**，如果有相邻元素，则同时标记 **与它相邻的两个元素** 。
 * - 重复此过程直到数组中所有元素都被标记。
 *
 * 请你返回执行上述算法后最后的分数。
 *
 * @param nums
 * @returns
 */
export default function (nums: number[]): number {
	const length = nums.length;
	let idxArr: number[] = [];
	for (let i = 0; i < length; i++) idxArr.push(i); // O(n)
	idxArr = idxArr.sort((a, b) => nums[a] - nums[b]); // 先给数组下标排序 O(n * log(n))

	let result = 0;
	const visited: boolean[] = []; // 记录是否访问过

	// O(n)
	for (const idx of idxArr) {
		if (!!visited.at(idx + 1)) continue;

		visited[idx + 2] = true;
		visited[idx] = true;
		result += nums[idx];
	}

	return result;
}
